// 从 json 配置文件中读取配置，并进行初始化操作

package config

import (
    "io/ioutil"
    "fmt"
    "os"
    "regexp"
    "encoding/json"
)

// 定义 json 配置文件的数据结构
type configJson struct {
    Database []DbConfig `json:"database"`
    Redis []RedisConfig `json:"redis"`
    Server serverConfig `json:"server"`
    Qcloud qcloudConfig `json:"qcloud"`
}

var jsonData configJson

// 读取 json 文件，解析并保存到变量 jsonData 中
func initJson()  {
    bytes, err := ioutil.ReadFile("./config.json")
    if err != nil {
        fmt.Println("ReadFile: ", err.Error())
        os.Exit(-1)
    }

    configStr := string(bytes[:])
    reg := regexp.MustCompile(`/\*.*\*/`)

    configStr = reg.ReplaceAllString(configStr, "")
    bytes = []byte(configStr)

    if err := json.Unmarshal(bytes, &jsonData); err != nil {
        fmt.Println("invalid config: ", err.Error())
        os.Exit(-1)
    }
}

// 服务器配置
type serverConfig struct {
    Ip       string
    Port     int
    LogDir   string
    PidFile  string
    HashSalt string
}

// 数据库配置
type DbConfig struct {
    Name         string
    Dialect      string
    Database     string
    User         string
    Password     string
    Host         string
    Port         int
    Charset      string
    MaxIdleConns int
    MaxOpenConns int
    Url          string
}

// 所有的数据库配置
var DB map[string]DbConfig

func initDb()  {
    DB = make(map[string]DbConfig)
    for _, config := range jsonData.Database {
        config.Url = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s",
            config.User, config.Password, config.Host, config.Port, config.Database, config.Charset)

        DB[config.Name] = config
    }
}

// 定义 redis 配置数据结构
type RedisConfig struct {
    Name      string
    Host      string
    Port      int
    Auth      string
    URL       string
    MaxIdle   int
    MaxActive int
}

// 所有的 redis 配置
var RedisConf map[string]RedisConfig
func initRedis()  {
    RedisConf = make(map[string]RedisConfig)
    for _, config := range jsonData.Redis {
        RedisConf[config.Name] = config
    }
}

var ServerConf serverConfig

func initServer()  {
    ServerConf = jsonData.Server
}

type qcloudConfig struct {
    Url string
    Domain string
    Proxy string
    AppId int
    SecretId string
    SecretKey string
    Bucket string
    Region string
    DurationSeconds int
    AllowPrefix string
    AllowActions []string
}

var QcloudConf qcloudConfig

func initQcloud()  {
    QcloudConf = jsonData.Qcloud
}

func init()  {
    initJson()
    initDb()
    initRedis()
    initServer()
    initQcloud()
}
